package utils

import (
	"fmt"
	"net"
)

// CalculateIPCount 计算CIDR网段中的IP地址数量
func CalculateIPCount(ipRange string) (int, error) {
	_, ipNet, err := net.ParseCIDR(ipRange)
	if err != nil {
		return 0, fmt.Errorf("解析CIDR失败: %v", err)
	}

	// 计算网段中的IP数量
	ones, bits := ipNet.Mask.Size()
	count := 1 << uint(bits-ones)

	return count, nil
}

// IncrementIP 将IP地址递增1
func IncrementIP(ip net.IP) {
	for i := len(ip) - 1; i >= 0; i-- {
		ip[i]++
		if ip[i] != 0 {
			break
		}
	}
}

// CopyIP 创建IP地址的副本
func CopyIP(ip net.IP) net.IP {
	dup := make(net.IP, len(ip))
	copy(dup, ip)
	return dup
}

// ParseIPRange 解析CIDR格式的IP范围
func ParseIPRange(ipRange string) (*net.IPNet, error) {
	_, ipNet, err := net.ParseCIDR(ipRange)
	if err != nil {
		return nil, fmt.Errorf("解析CIDR失败: %v", err)
	}
	return ipNet, nil
}

// IsIPInRange 检查IP是否在指定的CIDR范围内
func IsIPInRange(ip net.IP, ipNet *net.IPNet) bool {
	return ipNet.Contains(ip)
}
